package com.example.emos.wx.aop;
import com.example.emos.wx.common.util.R;
import com.example.emos.wx.config.shiro.ThreadLocalToken_过滤器Filter和AOP之间传递token;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


/**利用   切面类   向  客户端   返回新令牌*/


/**
 * AOP切面类作用拦截所有web请求（返回的R信息），通过     TokenAspect 把   token   返回  给客户端：
 * 即AOP切面类，拦截所有Web方法返回的R对象，然后在R对象里面添加新令牌
 * 判断是否刷新生成新的令牌：
 * 检查threadLocalToken中是否保存有令牌，把令牌保存到R对象中
 */
@Aspect/**声明切面类*/
@Component/**告诉给spring*/
/*利用切面类向客户端返回新令牌*/
public class TokenAspect {
    /*//AOP和拦截器的媒介，向AOP传递token*/
    @Autowired
    private ThreadLocalToken_过滤器Filter和AOP之间传递token threadLocalToken过滤器和AOP之间传递token;

    /*controller里面的方法的web请求都切面*/
    /*范围*/

    /** 拦截点 */
    @Pointcut("execution(public * com.example.emos.wx.controller.*.*(..))")
    public void aspect() {

    }

    /*切面中执行的方法，判断token是否有新的令牌，执行操作，向客户端返回新令牌*/
    /** 拦截点中执行的方法，范围是Around
     * 如果检查到 threadLocalToken里面有token，说明是生成了新的令牌，要塞入R中，R是返回给客户端的
     * 这样才能将TOKEN顺带返回给客户端*/
    @Around("aspect()")
    public Object around(ProceedingJoinPoint/**进行连接点*/ point) throws Throwable {
        R r = (R) point.proceed();
        String token = threadLocalToken过滤器和AOP之间传递token.getToken();
        /**检查threadLocalToken中是否保存有令牌，有的话说明生成了新的令牌   把令牌保存到R对象中*/
        if (token != null) {
            r.put("token", token);
            threadLocalToken过滤器和AOP之间传递token.clear();
        }
        return r;
    }
}